import {
  ensureJvm,
  importClass,
  JavaVersion,
  appendClasspath,
  newProxy,
  importClassAsync
} from 'java-bridge'
import SerialPort from 'serialport'


const java = (function () {
  let fdcInstance = null
  let FDC = null // 移动 FDC 到模块作用域
  let receiveDeviceMsg = null
  // 导入jar包初始化
  function initInstance() {
    ensureJvm({
      libPath: 'D:/res/jdk11/bin/server/jvm.dll',
      version: JavaVersion.VER_11,
      isPackagedElectron: true,
      opts: [
        '-Xms512m',
        '-Xmx1024m',
        '-XX:+UseG1GC',
        '-XX:MaxGCPauseMillis=200',
        '-XX:InitiatingHeapOccupancyPercent=30',
        '-XX:+ParallelRefProcEnabled',
        '-XX:ConcGCThreads=2',
        '-XX:ParallelGCThreads=2',
        '-XX:G1ReservePercent=15',
        '-XX:G1HeapRegionSize=8m',
        '-XX:+UseStringDeduplication',
        '-XX:+HeapDumpOnOutOfMemoryError',
        '-XX:HeapDumpPath=D:/tmp/heapdump.hprof'
      ]
    })
    appendClasspath('D:/res/fdc-1.0.jar')
    FDC = importClass('com.cssolution.FDC') // 将 FDC 赋值给模块变量
    return FDC.getInstanceSync()
  }

  //  查询所有设备 1
  function listDvcAndDvcVer() {
    return get().listDvcAndDvcVerSync()
  }

  // 查询所有设备类型 1
  function getDeviceTypeJsonStr() {
    return get().getDeviceTypeJsonStrSync()
  }
  // 设备
  // dialog 新增设备 确定 1
  function insertDvcAndDvcVersion(device) {
    return get().insertDvcAndDvcVersionSync(device)
  }

  // id删除单个设备 1
  function removeDvcAndDvcVersion(id) {
    return get().removeDvcAndDvcVersionSync(id)
  }

  // 修改设备 1
  function updateDvcAndDvcVersion(data) {
    return get().updateDvcAndDvcVersionSync(data)
  }

  // 根据id查询设备
  function getDvcAndDvcVerById(id) {
    return get().getDvcAndDvcVerByIdSync(id)
  }

  // 根据设备名称 或者 设备类型id 查村  带分页 1
  function pageDvcAndDvcVer(data, page, pagesize) {
    return get().pageDvcAndDvcVerSync(data, page, pagesize)
  }
  // 自动化
  // // 新增自动化 1
  // function batchInsertAutoSchedule(data) {
  //   return get().batchInsertAutoScheduleSync(data)
  // }

  //  自动化  模板id查 自动化
  function listAutoSchedByAutoTmpId(id) {
    return get().listAutoSchedByAutoTmpIdSync(id)
  }

  //  自动化  修改
  function CUDAutoSchedule(data, id) {
    return get().CUDAutoScheduleSync(data, id)
  }

  // // 自动化 批量删除
  // function removeAutoScheduleByIds(data) {
  //   return get().removeAutoScheduleByIdsSync(data)
  // }

  // 模板
  // 模板  新增1
  function insertAutoTemplate(data) {
    return get().insertAutoTemplateSync(data)
  }
  // 模板 启用
  function setRunAutoTmp(id) {
    return get().setRunAutoTmpSync(id)
  }

  // 模板传 id（后端匹配用）
  function setAutoTmpToAutoSched() {
    return get().setAutoTmpToAutoSchedSync()
  }
  //  模板名称查询 带分页
  function pageAutoTmp(data, page, pagesize) {
    return get().pageAutoTmpSync(data, page, pagesize)
  }
  //  模板  删除
  function removeAutoTmp(id) {
    return get().removeAutoTmpSync(id)
  }
  //  模板  修改
  function updateAutoTmp(data) {
    return get().updateAutoTmpSync(data)
  }
  // 模板 取消启用
  function cancelRunAutoTmp(id) {
    return get().cancelRunAutoTmpSync(id)
  }
  // 模板 查询
  function getAutoTmpById(id) {
    return get().getAutoTmpByIdSync(id)
  }
  //模板 复制模板
  function copyAutoTmp(id, Name) {
    return get().copyAutoTmpSync(id, Name)
  }

  // 通知警报 新增通知警报
  function insertAlert(data) {
    return get().insertAlertSync(data)
  }
  // 通知警报 删除通知警报
  function removeAlert(id) {
    return get().removeAlertSync(id)
  }
  // 通知警报 修改通知警报
  function updateAlert(data) {
    return get().updateAlertSync(data)
  }
  // 通知警报 根据id查询单个通知警报
  function getAlertById(data) {
    return get().getAlertByIdSync(data)
  }
  // 通知警报 查询所有通知警报
  function listAlert() {
    return get().listAlertSync()
  }
  // 通知警报 根据条件查询多个通知警报  带分页
  function pageAlert(data, page, pagesize) {
    return get().pageAlertSync(data, page, pagesize)
  }
  // 通知警报 修改通知警告的状态
  function changeAlertStatus(id, alent) {
    return get().changeAlertStatusSync(id, alent)
  }

  // 联系人 查询所有联系人
  function listContact() {
    return get().listContactSync()
  }

  // 获取设备实时信息
  function setReceiveDeviceMsg() {
    return get().setReceiveDeviceMsgSync(receiveDeviceMsg)
  }

  // 查询展示在首页的设备
  function listHomePageShowDvcAndDvcVer() {
    return get().listHomePageShowDvcAndDvcVerSync()
  }

  // 操作单个设备
  function operateDevice(deviceId, statusName, statusValue) {
    return get().operateDeviceSync(deviceId, statusName, statusValue)
  }

  // 查询系统参数
  function getSysValueJsonStr() {
    return get().getSysValueJsonStrSync()
  }

  // 修改系统参数
  function updateSysValue(data) {
    return get().updateSysValueSync(data)
  }

  // 获取COM口
  const getCOM = async () => {
    const res = await SerialPort.SerialPort.list()
    return res
  }

  // 打开COM 口
  function openCom(id, COM, baudRate, type, channel) {
    return get().openSerialSync(id, COM, baudRate, type, channel)
  }

  // 关闭COM 口
  function closeSerial(COM) {
    return get().closeSerialSync(COM)
  }

  // 自动化模板切换模式
  function changeAutoTmpMode(data) {
    return get().changeAutoTmpModeSync(data)
  }

  // 自动化模板切换模式
  function get485DeviceConnected(id) {
    return get().get485DeviceConnectedSync(id)
  }

  // 鱼桶 新增单条鱼桶数据
  function insertFishbowl(data) {
    return get().insertFishbowlSync(data)
  }
  // 鱼桶 删除单条鱼桶数据
  function removeFishbowl(id) {
    return get().removeFishbowlSync(id)
  }
  // 鱼桶 根据ID查询单条鱼桶数据
  function getFishbowl(id) {
    return get().getFishbowlSync(id)
  }
  // 鱼桶 查询所有鱼桶数据
  function listFishbowl() {
    return get().listFishbowlSync()
  }
  // 鱼桶 (分页)根据条件查询多条鱼桶数据
  function pageFishbowl(data, page, pagesize) {
    return get().pageFishbowlSync(data, page, pagesize)
  }
  // 查找所有指定属性
  function listPropertyByShowPageType(data) {
    return get().listPropertyByShowPageTypeSync(data)
  }
  // 修改指定属性
  function updateShowIndexInProperty(id, name, value) {
    return get().updateShowIndexInPropertySync(id, name, value)
  }
  // 保存首页tag
  function putIndexPropertyArr(data) {
    return get().putIndexPropertyArrSync(data)
  }
  // 拿首页tag数据
  function getIndexPropertyArr() {
    return get().getIndexPropertyArrSync()
  }
  // 首页电机状态 时时获取
  function getPropertyObjByDvcAndPropertyName(id, statusName) {
    return get().getPropertyObjByDvcAndPropertyNameSync(id, statusName)
  }
  // 关于 获取版本号
  function getSystemVersion() {
    return get().getSystemVersionSync()
  }
  // 修改单个首页展示数据
  function updateIndexPropertyJsonObj(data) {
    return get().updateIndexPropertyJsonObjSync(data)
  }
  // 新增单个首页展示数据
  function addIndexPropertyJsonObj(data) {
    return get().addIndexPropertyJsonObjSync(data)
  }
  // 删除单个首页展示数据
  function deleteIndexPropertyJsonObj(id) {
    return get().deleteIndexPropertyJsonObjSync(id)
  }
  // 批量新增单个首页展示数据
  function batchAddIndexPropertyJsonObj(data) {
    return get().batchAddIndexPropertyJsonObjSync(data)
  }
  // 查询首页展示数据  数字量
  function listIndexDigitalPropertyToJsonArr() {
    return get().listIndexDigitalPropertyToJsonArrSync()
  }
  // 查询首页展示数据  开关
  function listIndexSwitchPropertyToJsonArr() {
    return get().listIndexSwitchPropertyToJsonArrSync()
  }
  // 批量新增单个首页展示数据  数字量
  function swapAllIndexDigitalPropertyJsonObj(data) {
    return get().swapAllIndexDigitalPropertyJsonObjSync(data)
  }
  // 批量新增单个首页展示数据  开关
  function swapAllIndexSwitchPropertyJsonObj(data) {
    return get().swapAllIndexSwitchPropertyJsonObjSync(data)
  }
  // 修改属性对象的单个值
  function updatePropertyByJsonObj(id, name, key, value) {
    return get().updatePropertyByJsonObjSync(id, name, key, value)
  }
  //查询指定设备的名字
  function getDeviceNameByDeviceTableId(id) {
    return get().getDeviceNameByDeviceTableIdSync(id)
  }
  // 查询指定系统参数的属性名
  function getDeviceNameAndSystemParameterPropertyStatusName(id, name) {
    return get().getDeviceNameAndSystemParameterPropertyStatusNameSync(id, name)
  }
  // 查询 首页的手动或者自动
  function getGlobalAutoSchedRanStatus() {
    return get().getGlobalAutoSchedRanStatusSync()
  }
  // 获取时间 
  function getAndCalculateRunningTime() {
    return get().getAndCalculateRunningTimeSync()
  }
  // 获取所有COM
  function listAllUsedComName() {
    return get().listAllUsedComNameSync()
  }
  // 新增单个自定义设备类型
  function insertCustomDeviceType(data) {
    return get().insertCustomDeviceTypeSync(data)
  }
  // 删除单个自定义设备类型
  function removeCustomDeviceType(id) {
    return get().removeCustomDeviceTypeSync(id)
  }
  // 修改单个自定义设备类型
  function updateCustomDeviceType(data) {
    return get().updateCustomDeviceTypeSync(data)
  }
  // 查询所有自定义设备类型
  function listCustomDeviceType() {
    return get().listCustomDeviceTypeSync()
  }
  function get() {
    if (fdcInstance === null) {
      fdcInstance = initInstance()
      fdcInstance.initSync()
      // receiveDeviceMsg = newProxy('com.cssolution.auto.domain.inf.ReceiveDeviceMsg', {
      //   receiveDevice: (operatedDvcJsonObjStr) => {
      //   }
      // })
    }
    return fdcInstance
  }

  return {
    get,
    getDeviceTypeJsonStr, // 查询所有设备类型
    listDvcAndDvcVer, // 查询所有设备
    setAutoTmpToAutoSched, // 模板匹配  暂时没用上
    openCom, // 打开COM口
    getCOM, // 获取com口
    closeSerial, // 关闭COM口
    get485DeviceConnected, //获取当前的COM接口状态
    listPropertyByShowPageType, //查找所有指定属性
    getDeviceNameByDeviceTableId, // 查询指定设备的名字
    getDeviceNameAndSystemParameterPropertyStatusName,// 查询指定系统参数的属性名
    // 设备
    insertDvcAndDvcVersion, // 新增设备
    pageDvcAndDvcVer, //根据设备名称 或者 设备类型id 查村  带分页
    removeDvcAndDvcVersion, //id删除设备
    updateDvcAndDvcVersion, //修改设备
    getDvcAndDvcVerById, // 根据设备id 查询设备详细信息
    // 模板
    insertAutoTemplate, //新增模板
    pageAutoTmp, //根据名称查询模板 带分页
    removeAutoTmp, //删除模板
    updateAutoTmp, // 修改模板
    setRunAutoTmp, // 启用模板
    getAutoTmpById, // 模板查询
    cancelRunAutoTmp, // 取消启用
    copyAutoTmp, // 复制模板
    // 自动化
    listAutoSchedByAutoTmpId, //模板id查自动化
    CUDAutoSchedule, // 修改自动化
    // 通知警报
    insertAlert, //新增通知警报
    removeAlert, //删除通知警报
    updateAlert, //修改通知警报
    getAlertById, // 根据id查询单个通知警报
    listAlert, // 查询所有通知警报
    pageAlert, // 根据调教查询通知警报 带分页
    changeAlertStatus, // 修改通知警告的状态
    // 联系人
    listContact, //查询所有联系人
    // 首页
    setReceiveDeviceMsg, // 获取设备实时信息
    operateDevice, // 操作单个设备
    listHomePageShowDvcAndDvcVer, // 查询展示在首页的设备及其他信息
    getGlobalAutoSchedRanStatus, // 查询当前是手动还是自动
    // 系统
    updateSysValue, // 修改系统参数
    getSysValueJsonStr, //查询系统参数
    // 鱼桶
    insertFishbowl,
    removeFishbowl,
    getFishbowl,
    listFishbowl,
    pageFishbowl,
    // 关于
    getSystemVersion,
    // 首页
    listIndexDigitalPropertyToJsonArr,  // 查询首页展示数据  数字量
    listIndexSwitchPropertyToJsonArr, // 查询首页展示数据  开关
    swapAllIndexDigitalPropertyJsonObj,// 首页 开关
    swapAllIndexSwitchPropertyJsonObj,// 首页 数据替换
    updateIndexPropertyJsonObj, //修改单个首页展示数据
    updateShowIndexInProperty, //修改指定属性
    putIndexPropertyArr, // 保存首页tag
    getIndexPropertyArr, // 拿首页tag
    getPropertyObjByDvcAndPropertyName, //查询指定属性对象
    changeAutoTmpMode, // 首页自动手动切换
    addIndexPropertyJsonObj, // 新增单个首页展示数据
    deleteIndexPropertyJsonObj, //删除单个首页展示数据
    batchAddIndexPropertyJsonObj, //批量新增单个首页展示数据
    updatePropertyByJsonObj,// 修改属性对象的单个值
    getAndCalculateRunningTime,
    listAllUsedComName,
    // 自定义设备
    listCustomDeviceType, // 查询所有自定义设备类型
    updateCustomDeviceType,   // 修改单个自定义设备类型
    removeCustomDeviceType,  // 删除单个自定义设备类型
    insertCustomDeviceType  // 新增单个自定义设备类型
  }
})()

export default java
